package com.zjj.algorithm.learning.leetcode.queue;

import com.sun.jmx.remote.internal.ArrayQueue;

import java.util.LinkedList;
import java.util.Queue;

/**
 * 225. 用队列实现栈 简单题
 * 请你仅使用两个队列实现一个后入先出（LIFO）的栈，并支持普通栈的全部四种操作（push、top、pop 和 empty）。
 * <p>
 * 实现 MyStack 类：
 * <p>
 * void push(int x) 将元素 x 压入栈顶。
 * int pop() 移除并返回栈顶元素。
 * int top() 返回栈顶元素。
 * boolean empty() 如果栈是空的，返回 true ；否则，返回 false 。
 * <p>
 * 示例：
 * <p>
 * 输入：
 * ["MyStack", "push", "push", "top", "pop", "empty"]
 * [[], [1], [2], [], [], []]
 * 输出：
 * [null, null, null, 2, 2, false]
 * <p>
 * 解释：
 * MyStack myStack = new MyStack();
 * myStack.push(1);
 * myStack.push(2);
 * myStack.top(); // 返回 2
 * myStack.pop(); // 返回 2
 * myStack.empty(); // 返回 False
 *
 * @author zjj_admin
 * @date 2022/11/17 16:44
 */
public class ImplementStackUsingQueues {

    private static Queue<Integer> queue1;
    private static Queue<Integer> queue2;

    /**
     * 初始化两个队列
     */
    public ImplementStackUsingQueues() {
        queue1 = new LinkedList<>();
        queue2 = new LinkedList<>();
    }

    /**
     * 入栈操作思路：
     * 1、准备两个队列，queue1 为正式队列，queue2 为临时队列
     * 2、现将数据添加到临时队列【queue2】中
     * 3、只要正式队列不为空，就将正式队列中的数据全部添加到临时队列中。
     * 4、然后将正式队列与临时队列交换即可
     * @param x
     */
    public void push(int x) {
        queue2.offer(x);
        if(!queue1.isEmpty()){
            queue2.offer(queue1.poll());
        }
        //将两个队列逆序
        Queue<Integer> temp = queue1;
        queue1 = queue2;
        queue2 = temp;

    }

    /**
     * 出栈时就直接将正式队列中的数据取出一个即可
     * @return
     */
    public int pop() {
        Integer poll = queue1.poll();
        return poll != null ? poll : 1;
    }

    /**
     * 查看栈顶元素时，显示正式队列中的队头中的第一个数据
     * @return
     */
    public int top() {
        Integer peek = queue1.peek();
        return peek != null ? peek : 1;
    }

    /**
     * 判断栈是否为空，只需要判断正式队列是否为空
     * @return
     */
    public boolean empty() {
        return queue1.isEmpty();
    }
}
